Rclone を使った Azure Blob Storage から Amazon S3 へのオブジェクト同期を ECS でタスク実行してみた
いわさです。
前回はローカル環境上で Rclone を使って Azure Blob Storage から Amazon S3 へオブジェクトを同期する方法を試してみました。
最終的には自動化したいのでクラウド上で実行出来るようにしておきたいところです。
いくつかホスティングオプションが考えられそうですが、今回は勉強がてら私の経験の浅い Amazon ECS 上でタスクとして実行してみたいと思います。
タスク実行まで出来ればスケジュール実行は簡単に出来そうですよね。
コンテナイメージの作成
まず、以下のような Dockerfile を用意しました。
Rclone インストールの過程で curl と bash と install.sh で unzip 使っているのでインストールします。
また、Rclone の実行にあたって AWS CLI が必要なのでそちらもインストールしておきます。
Alipine の AWS CLI v2 インストールは面倒なので v1 にしました。
FROM alpine:latest RUN apk update RUN apk add curl bash unzip aws-cli # Install Rclone RUN curl https://rclone.org/install.sh | bash RUN mkdir /var/hoge COPY ./rclone.conf /var/hoge/rclone.conf # Clone Azure Storage to Amazon S3 CMD rclone --config "/var/hoge/rclone.conf" sync azureblob:${AZUREBLOB_CONTAINER} s3:${AWS_PATH} --azureblob-account ${AZUREBLOB_ACCOUNT} --azureblob-key ${AZUREBLOB_KEY}
[s3] type = s3 provider = AWS env_auth = true region = ap-northeast-1 location_constraint = ap-northeast-1 acl = private server_side_encryption = AES256 storage_class = STANDARD [azureblob] type = azureblob
RClone の構成ファイルをコピーしていますが、内容は少し前回から変更しています。
Azure 側の共有キーとストレージアカウントはコマンドのオプションで引き渡すことが出来るので環境変数から読み込むことにしました。
ちなみに Rclone のグローバルオプション(--config
)で 構成ファイルは任意のパスを指定することが出来ます。
ビルドしてコンテナレジストリ(今回は Amazon ECR)へプッシュしましょう。
% docker build --platform linux/amd64 . -t hoge0110rclone:v10 [+] Building 21.5s (11/11) FINISHED : % aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com Login Succeeded : % docker tag 9f1252293d90 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/rclone-azure-to-aws:v1 % docker images REPOSITORY TAG IMAGE ID CREATED SIZE hoge0110rclone v10 9f1252293d90 8 minutes ago 262MB 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/rclone-azure-to-aws v1 9f1252293d90 8 minutes ago 262MB : % docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/rclone-azure-to-aws:v1 The push refers to repository [123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/rclone-azure-to-aws] 4936efb8fece: Pushed 932515da7b2e: Pushed 50e5da887abd: Pushed 994b82cb9b62: Pushed e2f2111cf956: Pushed 8e012198eea1: Pushed v1: digest: sha256:adbc3197354d3163f4820b0eeacd5b6e01ffbc0fc7161ca03788fe55cfaaefd5 size: 1577
ECR リポジトリに登録出来ていることを確認しました。
タスク定義を作成
こちらの記事を参考にタスク定義を作成して適当なクラスターで実行します。
今回 Azure 側のキーを環境変数へプレーンテキストで渡してしまっているのですが、これだとマネジメントコンソールやタスク定義を API 取得するとキーが取得出来てしまうので良くないですね。
セキュリティベストプラクティスとしては以下のように Sysmtes Manager Parameter Store や Secrets Manager に格納した上で、ValueFrom
を使って環境変数へ引き渡しましょうとされていますのでそちらを参考にしてください。
Azure へのアクセスはストレージ共有キーを使いますが、Amazon S3 へのアクセスはタスクロールを使ってアクセスさせるので、Amazon S3 へのアクセスを許可したロールを設定します。
クラスターでタスクを実行して確認
最後に、作成出来たらタスクを実行してみます。
タスクが完了したら S3 バケットを確認してみましょう。
Azure Blob Storage のオブジェクトが同期されていました。
これでローカル環境を用意せずにクラウド間のオブジェクト同期が実現出来るようになりました。
さいごに
本日は Rclone を使った Azure Blob Storage から Amazon S3 へのオブジェクト同期を ECS でタスク実行してみました。
次回あたりにタスクを定期実行させた上で、何らかの Azure 上の Blob ストレージ上のデータを AWS 上で可視化したいなと思います。